/*
  funciones para recuperar la info del campo comm.afipcbtesasoc (comprobantes asociados)
  edu - 08/2022
*/

CREATE OR REPLACE FUNCTION public.str_get_atrib_ini_comp_asociados_afip(
    text,
    text)
  RETURNS character varying AS
$BODY$DECLARE
pTextoIni 		ALIAS FOR $1;
pAtributo 		ALIAS FOR $2;
Valor			TEXT;
vPosAtributo		INTEGER;
vLong			INTEGER;
BEGIN
-- Recibe un string tipo ini, con lineas de pares clave=valor, y devuelve el valor para una clave dada. 
-- Lo usa la funcion: servicios.afip_comprobantes_asociados(IdComm)
-- Las claves son case-insensitive
-- Supone que los valores estan encerrados entre comillas dobles.
Valor:= '';
IF pTextoIni IS NOT NULL THEN
   vPosAtributo:= INDEX(UPPER(pTextoIni), UPPER(pAtributo) || '=');
   IF vPosAtributo > 0 THEN
	Valor:= SUBSTRING(pTextoIni, vPosAtributo + LENGTH(pAtributo || '="'), 10000);
	vLong:= INDEX(Valor, '"') - 1;
	Valor:= SUBSTRING(Valor, 1, vLong);
   END IF;
END IF;
RETURN Valor;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.str_get_atrib_ini_comp_asociados_afip(text, text) OWNER TO abacouser;

-- ========================

CREATE OR REPLACE FUNCTION servicios.afip_comprobantes_asociados(date, date)
RETURNS TABLE(idcomm integer, rowstate text, tipo text, ptovta text, nro text, cbtefch text, cuitemisor text, texto text) AS
$BODY$
DECLARE
pFechaIni		ALIAS FOR $1;
pFechaFin		ALIAS FOR $2;

BEGIN

-- Esta funcion recibe un Rango de Fechas y devuelve un dataset con los datos de comm.afipcbtesasoc solo si tiene algo ese campo.
-- Para probar:       select * from servicios.afip_comprobantes_asociados(cast('2022-01-01' as date), cast('2022-12-31' as date)) x order by x.idcomm


CREATE TEMPORARY TABLE afip_comprobantes_asociados_tmp(
idcomm		integer,
rowstate	text,
tipo		text,
ptovta		text, 
nro		text, 
cbtefch	text, 
cuitemisor	text, 
texto		text
) ON COMMIT DROP;

INSERT INTO afip_comprobantes_asociados_tmp(texto)
SELECT unnest(string_to_array(replace(substring(afipcbtesasoc, 9 + position('<ROWDATA>' IN afipcbtesasoc), position('</ROWDATA>' IN afipcbtesasoc) - position('<ROWDATA>' IN afipcbtesasoc) - 9),
		'RowState=', 'IDCOMM="' || comm.id || '" RowState='), '<ROW '))
FROM comm
WHERE fecha BETWEEN pFechaIni AND pFechaFin AND TRIM(COALESCE(afipcbtesasoc, '')) <> '';

DELETE FROM afip_comprobantes_asociados_tmp x WHERE COALESCE(TRIM(x.texto), '') = '';

UPDATE afip_comprobantes_asociados_tmp x SET idcomm = CAST(str_get_atrib_ini_comp_asociados_afip(x.texto, 'IDCOMM') AS INTEGER);
UPDATE afip_comprobantes_asociados_tmp x SET rowstate = CAST(str_get_atrib_ini_comp_asociados_afip(x.texto, 'RowState') AS TEXT);
UPDATE afip_comprobantes_asociados_tmp x SET tipo = CAST(str_get_atrib_ini_comp_asociados_afip(x.texto, 'tipo') AS TEXT);
UPDATE afip_comprobantes_asociados_tmp x SET ptovta = CAST(str_get_atrib_ini_comp_asociados_afip(x.texto, 'ptovta') AS TEXT);
UPDATE afip_comprobantes_asociados_tmp x SET nro = CAST(str_get_atrib_ini_comp_asociados_afip(x.texto, 'nro') AS TEXT);
UPDATE afip_comprobantes_asociados_tmp x SET cbtefch = CAST(str_get_atrib_ini_comp_asociados_afip(x.texto, 'cbtefch') AS TEXT);
UPDATE afip_comprobantes_asociados_tmp x SET cuitemisor = str_get_atrib_ini_comp_asociados_afip(x.texto, 'cuitemisor');

-- RowState: info de estado del registro manejado por un ClientDataset de Delphi.
-- Delphi va registrando los cambios en el clientdataset (change_log), con RowState por ej: 13, 5, 6, 4, 12... 
-- RowState=4 -> registro nuevo; RowState=12 -> ultima version de registro modificado
DELETE FROM afip_comprobantes_asociados_tmp x WHERE x.rowstate NOT IN ('4', '12');

RETURN QUERY SELECT * FROM afip_comprobantes_asociados_tmp ORDER BY idcomm;
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION servicios.afip_comprobantes_asociados(date, date) OWNER TO abacouser;
COMMENT ON FUNCTION servicios.afip_comprobantes_asociados(date, date) IS 'Esta funcion recibe un rango de fechas y devuelve un dataset con los datos del campo comm.afipcbtesasoc';

-- ==================================
SELECT aaversion('482.01', '482.00');
-- ==================================

